0100 ; BINARY LOAD MENU PROGRAM 0110 ; NAME OBJECT FILE D:AUTORUN.SYS 0120 ; 0130 ; RICHARD J. KALAGHER 0140 ; AUGUST 7, 1983 0150 ; 0160 .OPT NOEJECT 0170 ; 0180 ; EQUATES 0190 ; 0200 SL=$C0 ;PAGE ZERO TEMPORARY 0210 SH=$C1 ;LOCATIONS. LAST 0220 STL=$C2 ;LETTER "L" FOR LOW 0230 STH=$C3 ;"H" FOR HIGH. 0240 ENL=$C4 0250 ENH=$C5 0260 BLL=$C6 0270 BLH=$C7 0280 CIO=$E456 0290 ICCMD=$0342 ;COMMAND 0300 ICBAL=$0344 ;BUFFER ADDRESS LOW 0310 ICBAH=$0345 ;BUFFER ADDRESS HIGH 0320 ICAX1=$034A ;AUX 1 0330 ICAX2=$034B ;AUX 2 0340 ICBLL=$0348 ;BUFFER LENGTH LOW 0350 ICBLH=$0349 ;BUFFER LENGTH HIGH 0360 ROWCRS=84 ;ROW FOR NEXT SCREEN WRITE 0370 COLCRS=85 ;COLUMN FOR NEXT SCREEN WRITE 0380 CRSINH=$02F0 ;CURSOR INHIBIT 0390 ; 0400 *=$1D7C ;***SEE TEXT*** 0410 ; 0420 MENU JSR OPENSC ;OPEN THE SCREEN/EDITOR 0430 JSR HEADER ;PUT A TITLE ON THE SCREEN 0440 JSR OPEDIR ;OPEN THE DIRECTORY FILE 0450 GG JSR GETDIR ;GET A DIRECTORY ENTRY 0460 BMI FOOT ;IF END OF DIRECTORY THEN JUMP 0470 JSR DIRSCN ;PUT THE DIRECTORY ENTRY ON THE SCREEN 0480 JMP GG ;GO BACK AND GET ANOTHER 0490 FOOT JSR FOOTER ;ENTRIES ON SCREEN, WRITE A MESSAGE 0500 JSR CLOSE2 ;CLOSE DIRECTORY FILE 0510 JSR CLOSE3 ;CLOSE THE SCREEN 0520 JSR SETUP ;SET RUN AND INIT TO RTS 0530 JSR OPENK ;OPEN THE KEYBOARD 0540 JSR GETLET ;GET A SINGLE LETTER 0550 JSR CLOSE3 ;CLOSE THE KEYBOARD 0560 JSR FINDNA ;FIND THE FILE NAME FOR THAT LETTER 0570 JSR OPEFIL ;OPEN THE FILE 0580 GETFIL JSR READ2 ;GET TWO BYTES 0590 JSR INIT ;SET INIT DEFAULT 0600 JSR CHKFF ;CHECK IF HEADER 0610 JSR STRAD ;PUT START ADDRESS IN 0620 JSR READ2 ;GET TWO MORE BYTES 0630 JSR ENDAD ;PUT END ADDRESS IN 0640 JSR BUFLEN ;CALCULATE BUFFER LENGTH 0650 JSR GETDAT ;GET THE DATA RECORD 0660 BMI JSTART ;START PROGRAM IF EOF 0670 JSR JINIT ;ATTEMPT INITIALAZATION 0680 JMP GETFIL ;DO NEXT SEGMENT 0690 JINIT JMP ($02E2) ;DO INITIALIZATION 0700 JSTART JSR CLOSE2 ;CLOSE THE FILE 0710 JMP ($02E0) ;START THE PROGRAM 0720 R RTS ;FOR INIT CODE 0730 ; 0740 ; START OF SUBROUTINES 0750 ; 0760 ; SET INITIALIZATION TO DEFAULT 0770 ; 0780 INIT LDA #R&$FF 0790 STA $02E2 0800 LDA #R/256 0810 STA $02E3 0820 RTS 0830 ; 0840 ; OPEN THE DIRECTORY FILE 0850 ; 0860 OPEDIR LDX #$20 ;IOCB#2 0870 LDA #3 ;OPEN COMMAND 0880 STA ICCMD,X 0890 LDA #6 ;DIRECTORY 0900 STA ICAX1,X 0910 LDA #B1&$FF 0920 STA ICBAL,X 0930 LDA #B1/256 0940 STA ICBAH,X 0950 JSR CIO 0960 RTS 0970 ; 0980 B1 .BYTE "D1:*.*" 0990 FNAME *=*+18 ;BUFFER FOR FILE NAME 1000 .BYTE $9B ;PROBABLY NO NEEDED 1010 BAL .BYTE 0 ;TWO BYTE BUFFER FOR 1020 BAH .BYTE 0 ;FILE HEADER AND ADDRESS 1030 ; 1040 ; OPEN FILE FOR READING 1050 ; 1060 OPEFIL LDX #$20 1070 LDA #3 1080 STA ICCMD,X 1090 LDA #FNAME&$FF 1100 STA ICBAL,X 1110 LDA #FNAME/256 1120 STA ICBAH,X 1130 LDA #4 ;OPEN FOR READ 1140 STA ICAX1,X 1150 JSR CIO 1160 RTS 1170 ; 1180 ; GET A SEGMENT FROM THE FILE 1190 ; 1200 GETREC LDX #$20 1210 LDA #7 ;GET BYTES 1220 STA ICCMD,X 1230 LDA SL 1240 STA ICBAL,X 1250 LDA SH 1260 STA ICBAH,X 1270 LDA BLL 1280 STA ICBLL,X 1290 LDA BLH 1300 STA ICBLH,X 1310 JSR CIO 1320 RTS 1330 ; 1340 ; READ TWO BYTES INTO BUFFER $C0 1350 ; 1360 READ2 LDA #BAL&$FF 1370 STA SL 1380 LDA #BAL/256 1390 STA SH 1400 LDA #2 1410 STA BLL 1420 LDA #0 1430 STA BLH 1440 JSR GETREC ;GO GET THEM 1450 RTS 1460 ; 1470 ; CALCULATE BUFFER LENGTH 1480 ; 1490 BUFLEN LDA ENL 1500 SEC 1510 SBC STL 1520 STA BLL ;LOW BYTE 1530 LDA ENH 1540 SBC STH 1550 STA BLH ;HIGH BYTE 1560 CLC ;NOW ADD ONE 1570 LDA BLL 1580 ADC #1 1590 STA BLL 1600 LDA BLH 1610 ADC #0 ;TAKE CARE OF ANY CARRY 1620 STA BLH 1630 RTS 1640 ; 1650 ; PUT START ADDRESS IN PROPER PL. 1660 ; 1670 STRAD LDA BAL 1680 STA STL 1690 LDA BAH 1700 STA STH 1710 RTS 1720 ; 1730 ; DO SAME FOR END ADDRESS 1740 ; 1750 ENDAD LDA BAL 1760 STA ENL 1770 LDA BAH 1780 STA ENH 1790 RTS 1800 ; 1810 ; CHECK IF HEADER 1820 ; 1830 CHKFF LDX BAL 1840 INX ;MAKE IT 0 IF ITS $FF 1850 BEQ TEST2 ;TEST NEXT BYTE 1860 RTS ;NOT A HEADER 1870 TEST2 LDX BAH 1880 INX 1890 BEQ ITSFF ;IT'S $FF 1900 RTS 1910 ITSFF JSR READ2 ;GET TWO MORE BYTES 1920 RTS 1930 ; 1940 ; GET DATA BYTES 1950 ; 1960 GETDAT LDA STL 1970 STA SL 1980 LDA STH 1990 STA SH 2000 JSR GETREC 2010 RTS 2020 ; 2030 ; CLOSE IOCBS 2040 ; 2050 CLOSE3 LDX #$30 2060 JMP CLB 2070 CLOSE2 LDX #$20 2080 CLB LDA #$0C 2090 STA ICCMD,X 2100 JSR CIO 2110 RTS 2120 ; 2130 ; GET A DIRECTORY RECORD 2140 ; 2150 GETDIR LDX #$20 ;IOCB 2 2160 LDA #5 ; GET BYTES 2170 STA ICCMD,X 2180 LDA #FNAME&$FF 2190 STA ICBAL,X 2200 LDA #FNAME/256 2210 STA ICBAH,X 2220 LDA #18 ;LENGTH OF DIRECTORY ENTRY 2230 STA ICBLL,X 2240 LDA #0 2250 STA ICBLH,X 2260 JSR CIO 2270 RTS 2280 ; 2290 ; OPEN THE SCREEN 2300 ; 2310 OPENSC LDX #$30 2320 LDA #3 ;OPEN 2330 STA ICCMD,X 2340 LDA #B4&$FF 2350 STA ICBAL,X 2360 LDA #B4/256 2370 STA ICBAH,X 2380 LDA #8 ;WRITE 2390 STA ICAX1,X 2400 LDA #0 ;MODE 0 2410 STA ICAX2,X 2420 JSR CIO 2430 LDA #1 ;ANY NONZERO 2440 STA CRSINH ;INHIBIT CURSOR 2450 RTS 2460 ; 2470 B4 .BYTE "E:" ;SCREEN DEVICE 2480 ; 2490 ; WRITE TO THE SCREEN 2500 ; 2510 WRITES LDX #$30 2520 LDA #$0B ;PUT CHARACTERS 2530 STA ICCMD,X 2540 LDA STL 2550 STA ICBAL,X 2560 LDA STH 2570 STA ICBAH,X 2580 LDA BLL 2590 STA ICBLL,X 2600 LDA BLH 2610 STA ICBLH,X 2620 JSR CIO 2630 RTS 2640 ; 2650 ; PUT HEADER ON SCREEN 2660 ; 2670 HEADER LDA #1 2680 STA ROWCRS ;ROW 1 2690 LDA #10 2700 STA COLCRS ;COLUMN 10 2710 LDA #B5&$FF 2720 STA STL 2730 LDA #B5/256 2740 STA STH 2750 LDA #16 ;BUFFER LENGTH 2760 STA BLL 2770 LDA #0 2780 STA BLH 2790 JSR WRITES 2800 INC ROWCRS ;LEAVE A SPACE 2810 RTS 2820 ; 2830 B5 .BYTE "Binary Load Menu" 2840 NUMKEY .BYTE "A" 2850 OFFSET .BYTE 0 ;OFFSET FOR FILE NAMES 2860 ; 2870 ; WRITE DIRECTORY ENTRIES ON SCR 2880 ; 2890 DIRSCN JSR CHKSYS ;CHECK IF A SYS FILE 2900 JSR CHKFRE ;CHECK IF "FREE SECTOR" ENTRY 2910 LDA #FNAME&$FF 2920 STA STL 2930 LDA #FNAME/256 2940 STA STH 2950 LDA #10 ;ONLY USE NAME, NOT EXT 2960 STA BLL 2970 LDA #0 2980 STA BLH 2990 INC ROWCRS 3000 LDY #6 3010 LDA NUMKEY 3020 CMP #78 3030 BCC FIRCOL 3040 LDY #24 ;SECOND COLUMN 3050 LDA ROWCRS 3060 CMP #16 3070 BNE FIRCOL 3080 LDA #3 3090 STA ROWCRS 3100 FIRCOL STY COLCRS 3110 LDA NUMKEY ;LETTER OF ENTRY 3120 STA FNAME ;PUT IN BUFFER 3130 LDA #45 ;DASH 3140 STA FNAME+1 3150 JSR PUTBUF ;PUT NAME IN BUFFER 3160 JSR WRITES ;PUT IT ON SCREEN 3170 INC NUMKEY ;ADVANCE FOR NEXT 3180 RTS 3190 ; 3200 ; CHECK IF SYS FILE 3210 ; 3220 CHKSYS LDA FNAME+10 3230 CMP #83 ;S 3240 BNE NOTSYS 3250 LDA FNAME+11 3260 CMP #89 ;Y 3270 BNE NOTSYS 3280 LDA FNAME+12 3290 CMP #83 ;S 3300 BNE NOTSYS 3310 PLA ;SYS FILE, SO PULL RETURN ADDRESS AND 3320 PLA ;DON'T WRITE IT ON SCREEN 3330 NOTSYS RTS 3340 ; 3350 ; CHECK IF "FREE SECTOR" ENTRY 3360 ; 3370 CHKFRE LDA FNAME+1 3380 CMP #$20 ;IT SHOULD BE A SPACE 3390 BEQ NOTFRE 3400 PLA 3410 PLA ;SKIP REST OF DIRSCREEN 3420 NOTFRE RTS 3430 ; 3440 ; WRITE PROMPT MESSAGE ON SCREEN 3450 ; 3460 FOOTER LDA #20 3470 STA ROWCRS 3480 LDA #4 3490 STA COLCRS 3500 LDA #B6&$FF 3510 STA STL 3520 LDA #B6/256 3530 STA STH 3540 LDA #31 3550 STA BLL 3560 LDA #0 3570 STA BLH 3580 JSR WRITES 3590 RTS 3600 ; 3610 B6 .BYTE "Press the Letter of Your Choice" 3620 ; 3630 ; OPEN KEYBOARD 3640 ; 3650 OPENK LDX #$30 3660 LDA #3;OPEN 3670 STA ICCMD,X 3680 LDA #B7&$FF 3690 STA ICBAL,X 3700 LDA #B7/256 3710 STA ICBAH,X 3720 LDA #4;READ 3730 STA ICAX1,X 3740 JSR CIO 3750 RTS 3760 ; 3770 B7 .BYTE "K:" ;KEYBOARD DEVICE 3780 ; 3790 ; PUT FILE NAMES IN A BUFFER 3800 ; 3810 PUTBUF LDY #0 3820 LDX OFFSET ;FIND CURRENT LOCATION 3830 LDA (STL),Y 3840 ORA #$80 ;SET LAST BIT 3850 STA NBUFF,X 3860 INX 3870 INY ;FIRST LETTER DONE 3880 INY ;SKIP THE DASH 3890 P1 LDA (STL),Y 3900 STA NBUFF,X 3910 CMP #32 ;SPACE? 3920 BEQ P2 ;YES, THEN DONE 3930 INX 3940 INY 3950 CPY #10 3960 BCC P1 3970 LDA #32 3980 STA NBUFF,X ;MAKE LAST A SPACE 3990 P2 STX OFFSET ;SAVE FOR NEXT TIME 4000 INC OFFSET ;FOR NEXT TIME 4010 RTS 4020 ; 4030 LETTER .BYTE 0 4040 ; 4050 ; FIND FILE NAME IN BUFFER 4060 ; 4070 FINDNA LDX #0 4080 L1 LDA NBUFF,X 4090 INX 4100 CMP LETTER 4110 BNE L1 4120 LDA #68 ;D 4130 STA FNAME 4140 LDA #58 ;COLON 4150 STA FNAME+1 4160 LDY #0 4170 L2 LDA NBUFF,X 4180 STA FNAME+2,Y 4190 INX 4200 INY 4210 CMP #$20 ;SPACE? 4220 BNE L2 4230 DEY 4240 LDA #46 ;PERIOD 4250 STA FNAME+2,Y 4260 INY 4270 LDA #42 ;ASTERISK 4280 STA FNAME+2,Y 4290 INY 4300 LDA #$20 ;SPACE 4310 STA FNAME+2,Y 4320 RTS 4330 ; 4340 ; GET A LETTER FROM THE KEYBOARD 4350 ; 4360 GETLET LDX #$30 ;IOCB 4370 LDA #7 ;GET BYTES 4380 STA ICCMD,X 4390 LDA #0 4400 STA ICBLL,X 4410 STA ICBLH,X ;BUFFER LENGTH ZERO 4420 JSR CIO ;A REG WILL CONTAIN LETTER 4430 CMP #65 ;LESS THAN "A"? 4440 BCC GETLET 4450 CMP NUMKEY ;GREATER THAN HIGHEST LETTER 4460 BCS GETLET 4470 ORA #$80 ;SET LAST BIT 4480 STA LETTER ;SAVE IT 4490 RTS 4500 ; 4510 ; SET RUN ADDRESS TO RTS 4520 ; 4530 SETUP LDA #R&$FF 4540 STA $02E0 ;RUN LOW 4550 LDA #R/256 4560 STA $02E1 4570 RTS 4580 ; 4590 ; BUFFER WITH NAMES WILL BE AT 4600 ; END OF PROGRAM. LETTER WILL 4610 ; HAVE LAST BIT SET & BE FOLLOWED 4620 ; BY A HYPHEN. 4630 ; 4640 NBUFF=* 4650 ; 4660 *=$02E2 ;INIT ADDRESS 4670 ; 4680 .WORD MENU ;INIT ADDRESS DATA 4690 ; 4700 .END